/**
 * Copyright (C) 2009 Fsti Inc.
 *
 */
package com.fsti.ppmw.port.payment;

import java.util.Date;

import org.apache.commons.lang.time.DateUtils;

/**
 * 交易流水号
 * 
 * 
 * @author Song Qing
 *
 */
public class TransactionNumber {
	
	/**
	 * 生成日期
	 */
	private static Date BUILD_DATE=new Date();
	/**
	 * 当前序列号
	 */
	private static long CURRENT_NUMBER=0;
	/**
	 * 生成序列号
	 * @return 序列号；按天生成、从1开始、隔天重置
	 */
	private static long generate(){
		Date current=new Date();
		if(DateUtils.isSameDay(current, BUILD_DATE)){//同一天，则序列号递增1
			CURRENT_NUMBER++;
		}else{//非同天，则序列号重置，生成日期重置
			CURRENT_NUMBER=1;
			BUILD_DATE=current;
		}
		return CURRENT_NUMBER;
	}
	/**
	 * 格式化序列号
	 * @param serialNumber
	 * @return 8位序列号；低位数前面用0补齐
	 */
	private static String format(long serialNumber){
		return String.format("%08d", serialNumber);
	}
	
	/**
	 * 生成交易流水号
	 * @param apId 应用系统标识
	 * @param timeStamp	时间戳	
	 * @return 交易流水号；应用平台ID(8位)+yyyymmdd(8位)+自增序列号(8位)
	 */
	static String generate(String apId,String timeStamp){
		StringBuilder apTransId=new StringBuilder(apId);
		apTransId.append(timeStamp.substring(0, "yyyymmdd".length()));
		apTransId.append(format(generate()));
		return apTransId.toString();
	}

}
